Skip to content

Add Indicator, Histogram2d, Icicle trace types + layout uirevision (#422)#423

Merged
andrei-ng merged 2 commits into
plotly:mainfrom
dathere:feature/trace-type-additions
Jul 27, 2026
Merged

Add Indicator, Histogram2d, Icicle trace types + layout uirevision (#422)#423
andrei-ng merged 2 commits into
plotly:mainfrom
dathere:feature/trace-type-additions

Conversation

@jqnatividad

Copy link
Copy Markdown
Contributor

Implements the four additions from #422, field-verified against the plotly.js v3.7.0 plot-schema.json.

Depends on #421. This branch is stacked on feature/trace-attribute-backfill, so until #421 merges the diff here also shows #421's commits; they collapse to just the #422 work once #421 lands. Please merge #421 first.

What's added

  • Indicator — KPI number / delta / gauge displays, with Mode (number/delta/gauge flaglist), Number, Delta/Direction, and a full Gauge (GaugeAxis, GaugeBar, Step, Threshold). Indicator::new(value) sets only value, leaving mode to the plotly.js default (consistent with sibling constructors).
  • Histogram2d — 2D histogram heatmap. Reuses histogram::{Bins, HistFunc, HistNorm} and heat_map::Smoothing; adds histfunc/histnorm/nbinsx/nbinsy/xbins/ybins/autobinx/autobiny. new(x, y) bins raw samples; new_xyz(x, y, z) takes a pre-computed matrix.
  • Icicle — hierarchical icicle chart (sibling of Treemap/Sunburst), with icicle-specific Tiling (reusing common::Orientation), a marker without treemap's pad/corner_radius/depth_fade, plus Leaf and Root.
  • layout.uirevision — preserves UI state (zoom/pan/selection/legend visibility) across Plotly.react/newPlot re-renders, complementing the trace-level uirevision added in Backfill common trace attributes for plotly.js 3.7 parity #421.

Notes

  • GaugeAxis covers all 27 meaningful indicator.gauge.axis attributes (tick placement, styling, label/exponent/number formatting, labelalias, tickformatstops), reusing common::{TickMode, ExponentFormat, TickFormatStop} and layout::{ArrayShow, TicksDirection} rather than layout::Axis — the latter carries ~70 attributes (grid lines, spikes, range sliders, subplot anchoring) that a gauge axis doesn't support and would silently serialize as ignored JSON.
  • New PlotType variants (Histogram2d, Icicle, Indicator) serialize via rename_all = "lowercase"; re-exported from traces/mod.rs and both lib.rs lists.
  • CHANGELOG updated under [Unreleased] → Added.

Verification

  • cargo build -p plotly (default) and --features all — clean
  • cargo test -p plotly --features all — 363 unit + 34 doc tests green (exact-JSON round-trips for each new trace, plus a layout uirevision test)
  • cargo clippy -p plotly --features all --all-targets -- -D warnings -A deprecated — clean
  • cargo +nightly fmt --all — applied

Browser-render smoke test not run (no chromedriver in this environment); JSON correctness rests on schema-grounded field names + round-trip tests.

🤖 Generated with Claude Code

jqnatividad added a commit to dathere/qsv that referenced this pull request Jul 11, 2026
…y.rs #423) (#4184)

* feat(viz): KPI overview row, icicle charts & layout uirevision (plotly.rs #423)

Adopt dathere/plotly branch `feature/trace-type-additions` (PR plotly/plotly.rs#423,
a strict superset of the prior pin) and use the new API in `viz`:

- viz smart now leads with a full-width KPI overview row of plotly `Indicator`
  tiles: a built-in completeness gauge plus the headline numeric measures (sum for
  extensive, mean for intensive). A measure becomes a gauge when the data
  dictionary supplies a validated `x-qsv.gauge_range` (drawn only when the range
  actually contains the observed value; a range also forces the mean so it lands
  in-scale) and a "vs target" delta when it supplies `x-qsv.target` (a
  semantically-justified goal, never a fabricated prior-period baseline). Renders
  in both the inline and typed-grid paths and stays invisible to --max-charts,
  the panel-count notices, and the render-path thresholds (it is a domain band,
  not a cartesian subplot). HTML-only.

- Add `viz icicle` subcommand and `--hierarchy-style icicle`, a level-aligned
  sibling of treemap/sunburst.

- Set layout-level `uirevision` centrally in apply_theme so user zoom/pan/
  selection/legend state survives the Plotly.newPlot re-renders that inject the
  fullscreen modebar button and recolor on theme toggle.

describegpt emission of gauge_range/target is deferred; until then the hints are
consumed from any dictionary that carries them, with completeness + number tiles
working with no dictionary.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

* fix(viz): don't orphan the 8th cartesian axis behind the KPI row (roborev #3602)

The leading KPI row is domain-positioned and consumes no cartesian axis, but it
still occupies panel index 0 in `smart_grid_parts`, so `pos = n + 1` labelled the
cartesian panels behind it x2..x9. With exactly MAX_SUBPLOTS (8) cartesian panels
on the typed-grid path the 8th chart landed on x9, which the typed `Layout`
(x1..x8) has no slot for — `assign_typed_axis` silently drops it, orphaning the
trace onto the default axis.

Subtract a one-slot `axis_offset` when the leading panel is the KPI row so the
cartesian axes number x1..x8. The KPI row and geo panels never coexist in this
assembler (geo forces the inline path for HTML; image exports carry no KPI row),
so a single leading offset is sufficient. Adds a regression test that drives the
exact 8-cartesian-panel boundary via `--max-charts 8`.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

* docs(viz): regenerate gallery with KPI overview row & add icicle showcase

The smart dashboards now lead with a KPI overview row (completeness gauge +
top-measure number tiles); regenerated the 7 affected smart_*.html figures so
they reflect it. Added a dedicated `viz icicle` example to gen_gallery.py so the
new chart type is showcased (gallery is now 38 figures).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

* docs(viz): correct icicle default-orientation comment; document pre-gen KPI-row lag (roborev #3604)

The icicle code comment claimed a top-down default, but plotly leaves
tiling.orientation at horizontal ("h") — root on the left, children fanning
right (confirmed in plotly.rs Tiling docs + live render). The gallery
description was already accurate; fixed the misleading code comment instead.

Also documented, per developer deferral, that the LLM-dependent pre-generated
dashboards intentionally lag the KPI/Completeness row until describegpt emits
the gauge_range/target dictionary hints and they can be regenerated in one pass.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@andrei-ng
andrei-ng force-pushed the feature/trace-type-additions branch 2 times, most recently from b4426aa to 1991c95 Compare July 27, 2026 13:18
jqnatividad and others added 2 commits July 27, 2026 15:19
… uirevision (plotly#422)

Add three new trace types and the layout-level uirevision attribute, with
field names verified against the plotly.js v3.7.0 plot-schema.json.

- Indicator: KPI number/delta/gauge displays (Gauge, Delta, Number config)
- Histogram2d: 2D histogram heatmap (histfunc/histnorm/nbinsx/nbinsy/xbins/
  ybins), reusing histogram's Bins/HistFunc/HistNorm and heat_map's Smoothing
- Icicle: hierarchical icicle chart (sibling of Treemap/Sunburst)
- layout.uirevision: preserve UI state (zoom/pan/selection) across re-renders,
  complementing the trace-level uirevision added in plotly#421

Includes PlotType variants, re-exports, exact-JSON round-trip tests, doctests,
and CHANGELOG entries.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Signed-off-by: Andrei Gherghescu <8067229+andrei-ng@users.noreply.github.com>
Signed-off-by: Andrei Gherghescu <8067229+andrei-ng@users.noreply.github.com>
@andrei-ng
andrei-ng force-pushed the feature/trace-type-additions branch from 1991c95 to 9097f90 Compare July 27, 2026 13:19
@andrei-ng
andrei-ng merged commit b8afc54 into plotly:main Jul 27, 2026
31 of 32 checks passed
@andrei-ng
andrei-ng deleted the feature/trace-type-additions branch July 27, 2026 13:27
@andrei-ng andrei-ng mentioned this pull request Jul 27, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants